00001 <?php
00002 require_once('iface.userdataprovider.inc.php');
00003 require_once(PATH_TO_ROOT.'courses/classes/class.Course.inc.php');
00004
00005 class UserData {
00006
00007 private $userID;
00008
00009 private $meta;
00010
00011 private $data;
00012
00013
00014 function __construct($userID) {
00015 $this->userID = $userID;
00016 $this->data = null;
00017 $this->meta = null;
00018 }
00019
00025 public function getMetaData() {
00026 if ($this->meta !== null) {
00027 return $this->meta;
00028 }
00029
00030 $this->getUserData();
00031
00032 return $this->meta;
00033 }
00034
00040 public function getUserData() {
00041 if ($this->data !== null) {
00042 return $this->data;
00043 }
00044
00045 $this->data = array();
00046 $this->getModules();
00047
00048 foreach ($this->meta[UserDataProvider::MODULE] as $module) {
00049 require_once PATH_TO_ROOT.$module['script'];
00050 $class = new $module['class'];
00051
00052
00053 if (in_array('UserDataProvider', class_implements($class))) {
00054 $data = $class->getUserData($this->userID);
00055
00056 if (count($data) > 0) {
00057 foreach ($data as $key => $temp) {
00058 $data[$key][UserDataProvider::ID] = intval($temp[UserDataProvider::ID]);
00059 $data[$key][UserDataProvider::DATE] = intval($temp[UserDataProvider::DATE]);
00060 $data[$key][UserDataProvider::MODULE] = $module[UserDataProvider::ID];
00061
00062 $this->data[] = $data[$key];
00063 }
00064 }
00065 } else {
00066
00067 echo 'Die Klasse: '.$module['class'].' implementiert die Schnittstelle: UserDataProvider nicht!';
00068 }
00069 }
00070
00071
00072 $this->getCourses();
00073 $this->sortData();
00074
00075 return $this->data;
00076 }
00077
00081 private function getModules() {
00082 global $db;
00083
00084 $this->meta[UserDataProvider::MODULE] = array();
00085 if ($modules = $db->get_results('SELECT id, script, class, name FROM userdata_modules ORDER BY name', ARRAY_A)) {
00086 foreach ($modules as $key => $module) {
00087
00088 $moduleID = intval($module[UserDataProvider::ID]);
00089 $this->meta[UserDataProvider::MODULE][$moduleID] = $module;
00090 $this->meta[UserDataProvider::MODULE][$moduleID][UserDataProvider::ID] = $moduleID;
00091 }
00092 }
00093 }
00094
00098 private function getCourses() {
00099 global $db;
00100
00101 $this->meta[UserDataProvider::COURSE] = array();
00102 foreach ($this->getUserData() as $key => $data) {
00103
00104 $courseID = intval($data[UserDataProvider::COURSE]);
00105 $this->data[$key][UserDataProvider::COURSE] = $courseID;
00106
00107 if (! isset($this->meta[UserDataProvider::COURSE][$courseID])) {
00108 if($result = $db->get_row('SELECT Name as name, closed, Semester as semester FROM courses WHERE ID='.$courseID, ARRAY_A)) {
00109 $this->meta[UserDataProvider::COURSE][$courseID] = array(
00110 'name' => $result['name'].' ('.Course::semesterDBtoString($result['semester']).')',
00111 UserDataProvider::CLOSED => (boolean) $result[UserDataProvider::CLOSED],
00112 UserDataProvider::POLICY => (boolean) $db->get_var('SELECT count(*) FROM course_policy WHERE course_id='.$courseID)
00113 );
00114 } else {
00115 $this->meta[UserDataProvider::COURSE][$courseID] = array(
00116 'name' => ' Unbekannter Kurs ('.$courseID.')',
00117 UserDataProvider::CLOSED => (boolean) true,
00118 UserDataProvider::POLICY => (boolean) false
00119 );
00120 }
00121 }
00122 asort($this->meta[UserDataProvider::COURSE]);
00123 $this->meta[UserDataProvider::COURSE][0] = array('name' => 'Foyer', UserDataProvider::CLOSED => false, UserDataProvider::POLICY => false);
00124 }
00125 }
00126
00132 private function sortData() {
00133 return usort($this->data, array($this, 'courseTransformation'));
00134 }
00135
00143 private function courseTransformation($a, $b) {
00144
00145 if ($a[UserDataProvider::COURSE] === 0 && $b[UserDataProvider::COURSE] !== 0) {
00146 return -1;
00147 } else if ($a[UserDataProvider::COURSE] !== 0 && $b[UserDataProvider::COURSE] === 0) {
00148 return 1;
00149 }
00150
00151
00152 $result = 0;
00153 if ($a[UserDataProvider::COURSE] !== 0 && $b[UserDataProvider::COURSE] !== 0) {
00154 $result = strcmp(
00155 $this->meta[UserDataProvider::COURSE][$a[UserDataProvider::COURSE]]['name'],
00156 $this->meta[UserDataProvider::COURSE][$b[UserDataProvider::COURSE]]['name']
00157 );
00158 }
00159
00160
00161 if($result === 0) {
00162 $result = strcmp(
00163 $this->meta[UserDataProvider::MODULE][$a[UserDataProvider::MODULE]]['name'],
00164 $this->meta[UserDataProvider::MODULE][$b[UserDataProvider::MODULE]]['name']
00165 );
00166 }
00167
00168
00169 if($result === 0) {
00170 $result = strcmp(
00171 substr($a[UserDataProvider::HINT], -strpos($a[UserDataProvider::HINT], '\n')),
00172 substr($b[UserDataProvider::HINT], -strpos($b[UserDataProvider::HINT], '\n'))
00173 );
00174 }
00175
00176
00177 if($result === 0) {
00178 $result = strcmp(
00179 $a[UserDataProvider::DATE],
00180 $b[UserDataProvider::DATE]
00181 );
00182 }
00183
00184 return $result;
00185 }
00186
00187 }
00188 ?>